import pandas as pd
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Alignment
from tkinter.filedialog import askopenfilename, asksaveasfilename
from tkinter.messagebox import showerror, showinfo
import tkinter as tk

# 简化任务单号列函数
def simplify_task_numbers(task_numbers):
    # 分割任务单号
    all_task_numbers = str(task_numbers).split('、')

    # 过滤出9个字符长度的任务单号
    valid_task_numbers = [num for num in all_task_numbers if len(num) == 9 and '/' not in num]
    invalid_task_numbers = [num for num in all_task_numbers if len(num) != 9 or '/' in num]

    # 提取前缀
    if valid_task_numbers:
        prefix = valid_task_numbers[0][:4]
    else:
        prefix = ''

    # 提取并排序后缀
    suffixes = sorted([num[-5:] for num in valid_task_numbers])

    simplified_suffixes = []
    start = None

    for i, num in enumerate(suffixes):
        if start is None:
            start = num
        elif int(num) - int(suffixes[i - 1]) == 1:
            continue
        else:
            if start == suffixes[i - 1]:
                simplified_suffixes.append(start)
            else:
                simplified_suffixes.append(f"{start}-{suffixes[i - 1]}")
            start = num

    if start is not None:
        if start == suffixes[-1]:
            simplified_suffixes.append(start)
        else:
            simplified_suffixes.append(f"{start}-{suffixes[-1]}")

    # 拼接简化后的任务单号和无效任务单号
    simplified_task_numbers = f"{prefix}{','.join(simplified_suffixes)}"
    if invalid_task_numbers:
        simplified_task_numbers += ','+ ','.join(invalid_task_numbers)
    if simplified_task_numbers.startswith(','):
        return '/'
    return simplified_task_numbers

root = tk.Tk()
root.withdraw()

# 选择源文件
source_file_path = askopenfilename(title="选择源文件", filetypes=[("Excel files", "*.xlsx")])
if not source_file_path:
    showerror("错误", "未选择源数据文件，请检查。")
    exit()
try:
    df = pd.read_excel(source_file_path)
    df = df[(df['使用仪器名称'] != '/') & (df['使用仪器名称'] != "")]
except FileNotFoundError:
    showerror("错误", "源文件不存在，请检查文件路径。")
    exit()
except pd.errors.ParserError:
    showerror("错误", "源文件数据格式错误，请检查文件内容。")
    exit()

# 定义期望的仪器名称顺序和对应的列顺序
column_orders = {
    '大天平': ['分析日期', '任务单号', '检测项目', '称量物品', '是否零点', '分析人'],
    '烘箱': ['分析日期', '任务单号', '使用温度', '仪器状况', '分析人', '检测项目'],
    '紫外': ['任务单号', '检测项目', '波长', '仪器状况', '分析人', '分析日期'],
    '恒温恒湿系统': ['分析日期', '任务单号', '检测项目', '使用温度', '使用湿度', '分析人'],
    '恒温恒湿箱': ['分析日期', '任务单号', '检测项目', '使用温度', '使用湿度', '分析人'],
    '小天平': ['分析日期', '任务单号', '检测项目', '称量物品', '是否零点', '分析人'],
    '气相色谱仪苯': ['分析日期', '任务单号', '检测项目', '仪器状况', '分析人'],
    '气相色谱仪非': ['分析日期', '任务单号', '检测项目', '仪器状况', '分析人'],
    'COD消解仪': ['任务单号', '检测项目', '分析日期', '分析人', '样品数量'],
    'pH计': ['分析日期', '任务单号', '仪器状况', '分析人'],
    '水浴锅': ['分析日期', '任务单号', '检测项目', '使用温度', '仪器状况', '分析人'],
    '浊度计': ['分析日期', '任务单号', '零点', '量程', '是否校准', '分析人'],
    '原子荧光仪': ['任务单号', '检测项目', '仪器状况', '分析人', '分析日期'],
    '红外分光光度计': ['分析日期', '任务单号', '样品数量', '仪器状况', '分析人','检测项目'],
    '气相色谱质谱仪': ['分析日期', '任务单号', '检测项目', '仪器状况', '分析人'],
    '高压锅': ['分析日期', '任务单号', '检测项目', '使用温度', '仪器状况', '分析人'],
    '生化培养箱': ['分析日期', '任务单号', '检测项目', '使用温度', '仪器状况', '分析人'],
    '原子吸收分光光度计': ['任务单号', '检测项目', '使用方法', '仪器状况', '分析人', '分析日期'],
    '离子计': ['分析日期', '任务单号', '检测项目', '仪器状况', '分析人'],
    '电加热板': ['任务单号', '检测项目', '分析日期', '分析人', '样品数量'],
    '电热恒温培养箱': ['分析日期', '任务单号', '检测项目', '使用温度', '仪器状况', '分析人'],
    '箱式电阻炉': ['分析日期', '任务单号', '使用温度', '仪器状况', '分析人', '检测项目']
}
desired_order = list(column_orders.keys())

# 定义仪器对应的列名和默认值
instrument_defaults = {
    '大天平': {'称量物品': '/', '是否零点': '\u2611是 □否'},
    '烘箱': {'使用温度': '105', '仪器状况': '正常'},
    '紫外': {'仪器状况': '正常'},
    '恒温恒湿系统': {'使用温度': '20', '使用湿度': '50'},
    '恒温恒湿箱': {'使用温度': '20', '使用湿度': '50'},
    '小天平': {'称量物品': '/', '是否零点': '\u2611是 □否'},
    '气相色谱仪苯': {'仪器状况': '正常'},
    '气相色谱仪非': {'仪器状况': '正常'},
    'pH计': {'仪器状况': '正常'},
    '水浴锅': {'使用温度': '100', '仪器状况': '正常'},
    '浊度计': {'零点': '/', '量程': '/', '是否校准': '是'},
    '原子荧光仪': {'仪器状况': '正常'},
    '红外分光光度计': {'仪器状况': '正常'},
    '气相色谱质谱仪': {'仪器状况': '正常'},
    '高压锅': {'使用温度': '120', '仪器状况': '正常'},
    '生化培养箱': {'使用温度': '44.5', '仪器状况': '正常'},
    '原子吸收分光光度计': {'使用方法': '/', '仪器状况': '正常'},
    '离子计': {'仪器状况': '正常'},
    '电热恒温培养箱': {'使用温度': '37', '仪器状况': '正常'},
    '箱式电阻炉': {'使用温度': '700', '仪器状况': '正常'},
}

# 选择保存新文件的路径
new_file_path = asksaveasfilename(title="选择保存新文件的路径", defaultextension=".xlsx", filetypes=[("Excel files", "*.xlsx")])
if not new_file_path:
    showerror("错误", "未选择保存路径，请检查。")
    exit()

with (pd.ExcelWriter(new_file_path, engine='openpyxl', mode='w') as writer):
    for instrument in desired_order:
        if not any(instrument in name for name in df['使用仪器名称']):
            worksheet = writer.book.create_sheet(title=instrument)
            continue

        df['使用仪器名称'] = df['使用仪器名称'].fillna('')
        instrument_df = df[df['使用仪器名称'].str.contains(instrument)]
        instrument_df.loc[:, '分析日期'] = pd.to_datetime(instrument_df['分析日期'])

        if instrument == '恒温恒湿系统':
            instrument_df.loc[:, '分析日期'] = instrument_df['分析日期'] - pd.DateOffset(days=1)

        if instrument == '气相色谱仪非':
            first_grouped_df = instrument_df.groupby(['分析日期', "任务单号"]).agg({
                '样品数量': "sum",
                '检测项目': lambda x: ','.join(set('非甲烷总烃' if item in ['非甲烷总烃（有组织）', '非甲烷总烃（无组织）'] else item for item in x)),
                '分析人': 'first'
            }).reset_index()
            grouped_df = first_grouped_df.groupby(['分析日期', "检测项目"]).agg({
                '任务单号': lambda x: '、'.join(str(item) for item in set(x)),
                '样品数量': "sum",
                '分析人': 'first'
            }).reset_index()

        elif instrument == '红外分光光度计':
            first_grouped_df = instrument_df.groupby(['分析日期',"检测项目"]).agg({
                '任务单号': lambda x: '、'.join(str(item) for item in x),
                '样品数量': "sum",
                '分析人': 'first'
            }).reset_index()
            grouped_df = first_grouped_df.groupby(['分析日期', '任务单号']).agg({
                '检测项目': lambda x: '、'.join(str(item) for item in x),
                '样品数量': "sum",
                '分析人': 'first'
            }).reset_index()

        elif instrument == '原子吸收分光光度计':
            first_grouped_df = instrument_df.groupby(['分析日期', '检测项目']).agg({
                '样品数量': "sum",
                '任务单号': lambda x: '、'.join(str(item) for item in x),
                '分析人': 'first'
            }).reset_index()
            grouped_df = first_grouped_df.groupby(['分析日期', '任务单号']).agg({
                '检测项目': lambda x: '、'.join(str(item) for item in x),
                '样品数量': "sum",
                '分析人': 'first'
            }).reset_index()
        else:
            grouped_df = instrument_df.groupby(['检测项目', '分析日期']).agg({
                '任务单号': lambda x: '、'.join(str(item) for item in x),
                '样品数量': "sum",
                '波长': 'first',
                '分析人': 'first'
            }).reset_index()

        # 创建结果 DataFrame
        result_df = pd.DataFrame(columns=column_orders[instrument])

        # 将 grouped_df 中的数据填充到 result_df 中
        for column in grouped_df.columns:
            if column in result_df.columns:
                result_df[column] = grouped_df[column]

        # 根据仪器名称动态添加列并填充默认值
        if instrument in instrument_defaults:
            for column, default_value in instrument_defaults[instrument].items():
                result_df[column] = default_value

        # 根据分析日期进行升序排序
        result_df = result_df.sort_values(by='分析日期', ascending=True)

        result_df.loc[:, '分析日期'] = result_df['分析日期'].dt.strftime('%Y年%m月%d日').astype(str)
        result_df.loc[:, '任务单号'] = result_df['任务单号'].apply(simplify_task_numbers)

        # 写入 Excel
        worksheet = writer.book.create_sheet(title=instrument)
        rows = dataframe_to_rows(result_df, index=False, header=True)
        for row_index, r in enumerate(rows):
            worksheet.append(r)
            for cell in worksheet.iter_rows(min_row=row_index + 1, max_row=row_index + 1):
                for sub_cell in cell:
                    sub_cell.alignment = Alignment(horizontal='center', vertical='center')

        # 调整列宽
        for column_cells in worksheet.columns:
            max_content_length = max(len(str(cell.value)) for cell in column_cells)
            max_header_length = len(str(column_cells[0].value))  # 获取标题的长度
            column_width = max(max_content_length, max_header_length) + 10
            worksheet.column_dimensions[column_cells[0].column_letter].width = column_width

showinfo("成功", "操作成功，数据已保存到新文件。")